package LeetCode.t6;

import java.util.Arrays;

/**
 * @author: Laity
 * @Project: JavaLaity
 * @Package: LeetCode.t6.Solution
 * @Date: 2023年03月03日 09:47
 * @Description: LeetCode第6题：N字型变换
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * TODO:思路：其实类似矩阵的布局方式，可以通过设置一个类似矩阵的存储，来达到将每行数据存储在一起。因为字符中间的空白字符并没有要求记录，这就简化了很多记录和运算。
 */

public class Solution {

    public static void main(String[] args) {
        String s = "PAYPALISHIRING";
        Solution ZigZagConversion = new Solution();
        int nums = 3;
        String output = ZigZagConversion.convert(s, nums);
        System.out.println(output);
        System.out.println("PAHNAPLSIIGYIR".equals(output));
    }

    public String convert(String s, int numRows) {
        // 1 <= s.length <= 1000 长度范围
        // s 由英文字母（小写和大写）、',' 和 '.' 组成
        // 1 <= numRows <= 1000
        if (numRows < 2) {
            return s;
        }

        String[] rows = new String[numRows];
        // System.out.println(Arrays.toString(rows));
        for (int i = 0; i < numRows; i++) {
            rows[i] = "";
        }
        int direction = -1;
        // 用于舍入
        int count = numRows - 1;
        int row = 0;
        // 字符串长度
        // System.out.println(s.length());

        for (int j = 0; j < s.length(); j++) {
            rows[row] = rows[row] + s.charAt(j);
            // 第一次将方向设为正
            if (j % count == 0) {
                direction = -direction;
            }
            row = row + direction;
            // System.out.println(row);
        }

        StringBuilder convertStr = new StringBuilder();
        for (int i = 0; i < numRows; i++) {
            convertStr.append(rows[i]);
        }
        return convertStr.toString();
    }
}
